/**
 * 
 */
package uy.com.pzit.fpmundialmodel.calculator;

import uy.com.pzit.fpmundialmodel.analyzer.MatchAnalyzer;
import uy.com.pzit.fpmundialmodel.domain.Encuentro;
import uy.com.pzit.fpmundialmodel.domain.Fase;
import uy.com.pzit.fpmundialmodel.domain.Pais;
import uy.com.pzit.fpmundialmodel.domain.Resultado;

/**
 * @author pferraz
 * 
 */
public final class RankingFifaCalculator {

	private static final int PR_VICTORIA = 3;
	private static final int PR_VICTORIA_CON_PENALES = 2;
	private static final int PR_EMPATE = 1;
	private static final int PR_DERROTA_CON_PENALES = 1;
	private static final int PR_DERROTA = 0;

	// private static final double IE_AMISTOSO=1.0;
	private static final double IE_ELIM_MUNDIAL = 2.5;
	// private static final double IE_FINAL_CONF=3.0;
	private static final double IE_FINAL_MUNDIAL = 4.0;

	private static final double PE_ACTUAL = 1.0;
	private static final double PE_1_MUND_ATRAS = 0.5;
	private static final double PE_2_MUND_ATRAS = 0.3;
	// private static final double PE_3_MUND_ATRAS=0.2;

	private static final double CANTIDAD_PAISES = 90;

	public static void calcular(Encuentro encuentro, double pesoConf1,
			double pesoConf2) {
		/* Calculo los multiplicadores comunes */
		double iE = getIE(Fase.valueOf(encuentro.getFase()));
		double pC = (pesoConf1 + pesoConf2) / 2;
		Resultado resP1 = MatchAnalyzer.analyzeResult(encuentro.getGolesP1(),encuentro.getGolesP2());
		Resultado resP2 = MatchAnalyzer.analyzeResult(encuentro.getGolesP2(),encuentro.getGolesP1());
		/* Calculo para pais 1 */
		
		/*Con esto nos aseguramos que cuando el contrario recien empieza no tenga posicion que afecte*/
		int posPaisContrario = (encuentro.getPais2().getPartidosEnCompeticion() == 0) ? 0
				: encuentro.getPais2().getPosEnRanking();
		calcularPais(encuentro.getPais1(), resP1, iE, posPaisContrario,encuentro.getPenales(), pC);
		/* Calculo para pais 2 */
		posPaisContrario = (encuentro.getPais1().getPartidosEnCompeticion() == 0) ? 0
				: encuentro.getPais1().getPosEnRanking();
		calcularPais(encuentro.getPais2(), resP2, iE, posPaisContrario,	encuentro.getPenales(), pC);

	}

	private static void calcularPais(Pais pais, Resultado resultado, double iE,	double posRankOponente, Boolean penales, double pC) {
		double fO = (CANTIDAD_PAISES - posRankOponente) / 100;
		double pR;
		if (resultado == Resultado.GANO)
			pR = (penales) ? PR_VICTORIA_CON_PENALES : PR_VICTORIA;
		else if (resultado == Resultado.EMPATO)
			pR = PR_EMPATE;
		else
			pR = (penales) ? PR_DERROTA_CON_PENALES : PR_DERROTA;

		double ranking = 100 * (pR * iE * fO * pC);
		ranking += pais.getRankingFifa() / 2;// Para ir acumulando los resultados actuales
		pais.setRankingFifa((int) ((ranking *= PE_ACTUAL)
				+ (pais.getrFifa1ant() * PE_1_MUND_ATRAS) + (pais
				.getrFifa2ant() * PE_2_MUND_ATRAS)));
	}

	private static double getIE(Fase fase) {
		return (fase == Fase.FINAL) ? IE_FINAL_MUNDIAL : IE_ELIM_MUNDIAL;
	}

}
